import { findCartListApi, mergeLocalCartApi, insertCartApi, deleteCartApi, updateCartApi, checkAllCartApi } from '@/api/cart'

export default {
  namespaced: true,
  state: {
    // 购物车商品列表
    list: []
  },
  /**
   * 计算state得到一个新变量值=》getters类似组件中计算属性
   * 1. 有效商品列表=》无效商品（没库存或下架了）
     2. 选中的购物车商品数据
     3. 选中商品总价
     4. 购物车中有效商品是否是全部选中状态
   */
  getters: {
    // 有效商品列表
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品选中的列表
    seledList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    //  有效选中商品总价
    seledListTotal (state, getters) {
      return getters.seledList.reduce((acc, item) => acc + item.nowPrice * item.count, 0)
    },
    // 有效商品是否是全部选中状态: true 全部选中 | false 至少有一个没选中
    isAll (state, getters) {
      return getters.validList.every(item => item.selected)
    }

  },
  mutations: {
    /**
     * 存储登录后从后台查询购物车数据
     * @param {*} state
     * @param {*} list
     */
    setList (state, list) {
      state.list = list
    },
    /**
     *
     * @param {*} state
     * @param {*} good 加入购物车的商品
     */
    addCart (state, good) {
      /**
       * 核心：
       * 判断当前good之前是否已经加入过
       * 1. 没有 =》新增
       * 2. 有 =》数量增加
       */
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      if (index > -1) {
        // 加入过
        state.list[index].count += good.count
      } else {
        // 没有加入过
        state.list.unshift(good)
      }
    },
    /**
     * 商品单选
     * @param {*} state
     * @param {*} { good, sel }
     */
    singleCheck (state, { good, sel }) {
      /**
       * 1. 获取当前修改单选状态的商品
       * 2. 执行单选状态修改
       */
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = sel
    },
    /**
     * 全选
     * @param {*} state
     * @param {*} isAll
     */
    selAll (state, isAll) {
      state.list.forEach(item => {
        item.selected = isAll
      })
    },
    /**
     * 删除
     * @param {*} state
     * @param {*} good
     */
    delGood (state, good) {
      state.list = state.list.filter(item => item.skuId !== good.skuId)
    },
    /**
     *
     * @param {*} state
     * @param {*} { good, count }
     */
    changeCount (state, { good, count }) {
      /**
       * 1. 获取当前修改单选状态的商品
       * 2. 执行单选状态修改
       */
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.count = count
    }
  },
  actions: {
    /**
     * 登录后：获取当前登录人购物车列表数据
     */
    async getCartAction ({ commit }) {
      const { result } = await findCartListApi()
      commit('setList', result)
    },
    /**
     * 登录后：合并购物车 => 登录成功后调用
     * @param {*} param0
     */
    async mergeCartAction ({ state, dispatch }) {
      // 1. 有数据，进未登录本地购物车数据合并
      if (state.list.length > 0) {
        // 有数据进行合并操作
        // data= [{skuId, selected, count}]
        // 1. 后台需要的data格式
        const data = state.list.map(({ skuId, selected, count }) => {
          // return {
          //   skuId: item.skuId,
          //   selected: item.selected,
          //   count: item.count
          // }
          return {
            skuId,
            selected,
            count
          }
        })
        console.log('要合并的本地购物车列表数据：', data)
        // 2. 进行合并操作 =》把之前本地存储的购物车数据，合并到当前登录人名下=》入库
        await mergeLocalCartApi(data)
      }
      // 2. 从后台获取登录人最新的购物车列表数据
      dispatch('getCartAction')
    },
    /**
     * 加入购物车
     * 1. == 未登录=》加入购物车=》直接存储到vuex并持久化（今天实现）==
     * 2. 登录 =》加入购物车=》调用后台api存到数据库
     * @param {*} param0
     * @param {*} good 加入购物车的商品
     */
    async addCartAction ({ commit, rootState, dispatch }, good) {
      // commit('updateValue', good)
      if (rootState.user.profile.token) {
        // 1. 已登录
        await insertCartApi(good)
        dispatch('getCartAction')
      } else {
        // 2. 未登录
        commit('addCart', good)
      }
    },
    /**
     * 商品单选
     * @param {*} param0
     * @param {*} {good, sel}
     */
    async singleCheckAction ({ commit, rootState, dispatch }, { good, sel }) {
      // commit('updateValue', good)
      if (rootState.user.profile.token) {
        // 1. 已登录
        await updateCartApi({ ...good, selected: sel })
        dispatch('getCartAction')
      } else {
        // 2. 未登录
        commit('singleCheck', { good, sel })
      }
    },
    /**
     * 全选
     * @param {*} param0
     * @param {*} selected  全选框的选中状态：true | false
     */
    async selAllAction ({ commit, rootState, getters, dispatch }, selected) {
      // commit('updateValue', good)
      if (rootState.user.profile.token) {
        // 1. 已登录
        // 全选有效商品的skuId集合
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCartApi({ selected, ids })
        dispatch('getCartAction')
      } else {
        // 2. 未登录
        commit('selAll', selected)
      }
    },
    /**
     * 删除
     * @param {*} param0
     * @param {*} good
     */
    async delGoodAction ({ commit, rootState, dispatch }, good) {
      // commit('updateValue', good)
      if (rootState.user.profile.token) {
        // 1. 已登录
        await deleteCartApi([good.skuId])
        dispatch('getCartAction')
      } else {
        // 2. 未登录
        commit('delGood', good)
      }
    },
    /**
     * 修改数量
     * @param {*} param0
     * @param {*} { good, count }
     */
    async changeCountAction ({ commit, rootState, dispatch }, { good, count }) {
      // commit('updateValue', good)
      if (rootState.user.profile.token) {
        // 1. 已登录
        await updateCartApi({ ...good, count })
        dispatch('getCartAction')
      } else {
        // 2. 未登录
        commit('changeCount', { good, count })
      }
    }
  }
}
